package cz.vse.adventura.po1715.xforv00_forejt.hra;

import java.util.Collection;
import static cz.vse.adventura.po1715.xforv00_forejt.hra.Texty.*;


/*******************************************************************************
 * Instance třídy {@code PříkazPodej} představuje příkaz,
 * kterým hráč předá předmět postavě, která se vyskytuje v místnosti.
 *
 * @author Vladimír Forejt
 */
public class PříkazPodej extends APříkaz {



//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    private String PODAL = zPODAL;
    private final String PRODAVACKA_PODAVA = zPRODAVACKA_PODAVA;
    private final String UREDNIK_PODAVA = zUREDNIK_PODAVA;
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     *
     */
    public PříkazPodej()
    {
        super(pPODEJ, pPODEJpopis);
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Podá zadaný předmět postavě. Předmět musí být v batohu.
     * Postavy mají definované předměty, které přijímají.
     *
     * @param parametry komu co
     * @return Text zprávy vypsané po provedení příkazu
     */
    @Override
    @SuppressWarnings("unchecked")
    public String execute( String... parametry )
    {
        if(parametry.length <= 1) {
            return "Musí být zadána postava a předmět, který chcete předat";
        }

        //Proměnné
        String názevPostavy = parametry[0];
        String názevPředmětu = parametry[1];
        String podal = ""; //Obsahuje text, pokud osoba přijala předmět
        String podava = ""; //Obsahuje text, ktery rekne osoba, kdyz dostane vsechny predmety
        Předmět předmět = null;
        Postava postava = null;
        Hra h = Hra.getHra();
        Batoh b = Batoh.getBatoh();
        Místnost aktuální = h.getActualPlace();
        Collection<Předmět>  předměty = (Collection<Předmět>) aktuální.getObjects();

        //Hledá postavu v aktuální místnosti. Ověřuje, jestli je to osoba
        for (Předmět osoba : předměty) {
            if(osoba.getName().equalsIgnoreCase(názevPostavy) && osoba.isPerson())
            {
                postava = (Postava)osoba;
                break;                              //----------------------->
            }

        }
        if (postava == null) {
            return zNENI_POSTAVA;
        }

        //Kontrola, jestli je zadaný předmět v batohu a jestli ho osoba chce
        předmět = b.odeber(názevPředmětu);
        if (předmět == null) {
            return zNEMA_PŘEDMĚT;
        } else {
            if (postava.přijmePředmět(názevPředmětu)) {
                //podal = String.format(PODAL, postava.getName(), předmět.getName());
                podal = ("Podal(a) jste postavě " + postava.getName() + " předmět " + předmět.getName() + ".");
             } else {
                //Vrátí zpět do batohu
                b.přidej(předmět);
                return postava.getName() + " "+ předmět.getName() + " nechce.";
            }
        }

        //Postava vydá svůj předmět do místnosti, pokud už dostala všechny
        //požadované předměty
        if(postava.getPožadované().isEmpty()) {
            aktuální.polož(postava.vydejPředmět());
            if(postava.getName().equalsIgnoreCase(PRODAVACKA)) {
                podava = PRODAVACKA_PODAVA;
                //podava = "Prodavačka položila na stůl fotografie.";
            } else {
                podava = UREDNIK_PODAVA;
            }

        }
        return podal + podava;

    }

//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//     /***************************************************************************
//      * Testovací metoda.
//      */
//     public static void test()
//     {
//         PříkazPodej instance = new PříkazPodej();
//     }
//     /** @param args Parametry příkazového řádku - nepoužívané. */
//     public static void main(String[] args)  {  test();  }
}
